<?php
namespace core\helper;
/**
 * 验证码生成及校验器
 */
class Code{
    
    /**
     * 生成一个验证码
     */
    public static function create($moble,$key = '',$length = 4,$time = 600){        
        if( config('runtime') != 'production' ){
            $randstr = 1111;
        }else{
            $cache = cache("core_code_".$key.$moble);
            if( $cache ){
                $randstr = $cache['code']; //发上一次的验证码 防止短信延时收取不到正确的验证码
            }else{
                $str = '0123456789';
                $len=strlen($str)-1;
                $randstr='';
                for($i=0;$i<$length;$i++) $randstr .= $str[mt_rand(0,$len)];
            }
        }        
        $save = [
            'code' => $randstr,
            'time' => 0
        ];
        cache("core_code_".$key.$moble,$save,$time);
        return $randstr;
    }
    
    /**
     * 校验验证码合法性
     * @param $moble 校验的手机号码 
     * @param $key   防止各种场景验证码串用 场景标识key
     * @param $code  校验的验证码
     * @param $getToken 是否返回token 
     */
    public static function verify($moble,$key='',$code,$getToken = false ){
        if( !$code ) return false;
        $cache = cache("core_code_".$key.$moble);
        if(!$cache ) return false;
        if($cache['code'] != $code ) return false;
        $cache['time'] ++;
        if( $cache['time'] > 2 ) $cache = null;
        cache("core_code_".$key.$moble,$cache,600);
        if( $getToken && $cache['time'] ){
            return self::createToken($moble);            
        }
        return $cache['time']?:false;
    }
    
    /**
     * 创建token 可用于身份验证之后的后续安全校验使用
     */
    public static function createToken($moble,$time = 1800){
        $token = 'code'.md5($moble.date('dhi').'asdf');
        cache("core_token_".$moble,$token,$time);
        return $token;
    }
    
    /**
     * 校验token
     */
    public static function verifyToken($moble,$token,$isDel = false){
        $cache = cache("core_token_".$moble);        
        $result = $cache == $token;
        if( $result && !$isDel ) cache("core_token_".$moble,$token,1800); // 延长时间
        if( $isDel ) cache("core_token_".$moble,null);
        return $result;
    }
}